Smarty Template Engine ספריה לתבניות בPHP. מפרידים את הצד לקוח מהצד שרת.
הכירו את הספריה Smarty ספריה להפריד צד לקוח מהצד שרת (MVC), ספריה חינמית לחלוטין.
קישור לאתר שלה: Smarty
לא יודעים מה זה MVC?
הוספת הספריה
1.הורידו את הספריה מהאתר אינטרנט שלהם.
2.כנסו לתיקייה היחידה שיש שם ושם תמצאו עוד תיקייה בשם libs העבירו את התיקייה libs אל תיקיית הפרויקט.
3.הוסיפו אל הקוד את המחלקה בעזרת הקוד הזה:
require_once 'libs/Smarty.class.php';
זה טוען את המחלקה Smarty אל הדף.
מחלקה חדשה
ניצור משתנה בשם smarty שבו נגדיר את המחלקה Smarty
$smarty = new Smarty();
עכשיו צריך להגדיר את התיקייה שממנה הוא קורא את התבניות.
אז ניצור תיקייה חדשה בפרויקט בשם templates
ונוסיף את הקוד הזה:
$smarty = new Smarty();
$smarty->template_dir = "templates";
$smarty->template_dir = "templates";
פה בעצם הגדרנו את התיקייה templates שהיא התיקייה שיש בא את כל התבניות.
עכשיו צריך להגדיר את התיקייה של הקימפולים שהם ממירים את הקודים האלו שיש בצד לקוח לצד שרת.
אז בתוך התיקייה templates ניצור תיקייה בשם compile ועכשיו נגדיר את הcompile dir.
$smarty = new Smarty();
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates/compile";
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates/compile";
עכשיו ניצור את התבנית שלנו.
בתוך התיקייה templates ניצור קובץ בשם index.html
ונכתוב בו
<html>
<head>
<title>{$title}</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
Welcome <b>{$name}</b>,
</body>
</html>
<head>
<title>{$title}</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
Welcome <b>{$name}</b>,
</body>
</html>
עכשיו יש שני בעיות:
1. המשתנים title, name לא נמצאים.
2. לא הדפסנו את התבנית.
דבר ראשון נגדיר את שני המשתנים.
<?php
$smarty = new Smarty();
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates/compile";
$smarty->assign("title","זאת כותרת האתר");
$smarty->assign("name","אליהו");
?>
$smarty = new Smarty();
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates/compile";
$smarty->assign("title","זאת כותרת האתר");
$smarty->assign("name","אליהו");
?>
פה בעצם הגדרנו את המשתנים title ו-name.
עכשיו נדפיס את התבנית שלנו.
$smarty = new Smarty();
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates/compile";
$smarty->assign("title","זאת כותרת האתר");
$smarty->assign("name","אליהו");
$smarty->display('index.html');
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates/compile";
$smarty->assign("title","זאת כותרת האתר");
$smarty->assign("name","אליהו");
$smarty->display('index.html');
עכשיו יש בעיה קטנה כל פעם שנגדיר את המחלקה Smart אנחנו צריכים להגדיר את המשתנה של התבניות והקימפולים. ואם נרצה לשנות את השם של התבניות אז נשנה בכל הפעמים שהגדרנו את המשתנה? ואם הגדרנו 100 פעמים יהיה לכם כוח לשנות 100 פעמים?
אז בואו פשוט ניצור פונקציה שתיצור משתנה Smarty
function NewSmarty() {
$smarty = new Smarty();
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates/compile";
return $smarty;
}
$smarty = NewSmarty();
$smarty->assign("title","זאת כותרת האתר");
$smarty->assign("name","אליהו");
$smarty->display('index.html');
$smarty = new Smarty();
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates/compile";
return $smarty;
}
$smarty = NewSmarty();
$smarty->assign("title","זאת כותרת האתר");
$smarty->assign("name","אליהו");
$smarty->display('index.html');
תנאים
בתבניות ניתן ליצור תנאים.
<html>
<head>
<title>{$title}</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
{if $a eq 1}
Welcome <b>{$name}</b>,
{else}
a is not equal to 1
{/if}
</body>
</html>
<head>
<title>{$title}</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
{if $a eq 1}
Welcome <b>{$name}</b>,
{else}
a is not equal to 1
{/if}
</body>
</html>
מה שעשיתי פה זה בעצם בדקתי אם המשתנה a שווה למספר 1.
אבל המשתנה a לא קיים אז בואו ניצור אותו
<?php
function NewSmarty() {
$smarty = new Smarty();
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates/compile";
return $smarty;
}
$smarty = NewSmarty();
$smarty->assign("title","זאת כותרת האתר");
$smarty->assign("name","אליהו");
$smarty->assign("a", 1);
$smarty->display('index.html');
?>
function NewSmarty() {
$smarty = new Smarty();
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates/compile";
return $smarty;
}
$smarty = NewSmarty();
$smarty->assign("title","זאת כותרת האתר");
$smarty->assign("name","אליהו");
$smarty->assign("a", 1);
$smarty->display('index.html');
?>
נחשו מה אמור להיות התוצאה :-)
את הרשימה של הבדיקות ניתן למצוא כאן
foreach
בתבניות ניתן גם להשתמש בforeach.
<html>
<head>
<title>{$title}</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
{if $a eq 1}
Welcome <b>{$name}</b>,
{else}
a is not equal to 1
{/if}
<br />
{foreach from=users item=$user}
ID: {$user['id']}
Name: {$user['name']}
<br />
{/foreach}
</body>
</html>
<head>
<title>{$title}</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
{if $a eq 1}
Welcome <b>{$name}</b>,
{else}
a is not equal to 1
{/if}
<br />
{foreach from=users item=$user}
ID: {$user['id']}
Name: {$user['name']}
<br />
{/foreach}
</body>
</html>
כמו שאתם רואים עשיתי פה לולאה למערך שבתוכו יש עוד מערכים שהם מחזיקים את הפרטים של המשתמשים.
אם תשימו לב אז תראו שבfrom לא עשיתי דולר.
עכשיו נגדיר את המשתנה של המשתמשים:
<?php
function NewSmarty() {
$smarty = new Smarty();
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates/compile";
return $smarty;
}
$users = array(
array(
"id" => 1,
"name" => "אליהו"
),
array(
"id" => 2,
"name" => "חיים"
),
array(
"id" => 3,
"name" => "משה"
)
);
$smarty = NewSmarty();
$smarty->assign("title","זאת כותרת האתר");
$smarty->assign("name","אליהו");
$smarty->assign("a", 1);
$smarty->assign("users", $users);
$smarty->display('index.html');
?>
function NewSmarty() {
$smarty = new Smarty();
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates/compile";
return $smarty;
}
$users = array(
array(
"id" => 1,
"name" => "אליהו"
),
array(
"id" => 2,
"name" => "חיים"
),
array(
"id" => 3,
"name" => "משה"
)
);
$smarty = NewSmarty();
$smarty->assign("title","זאת כותרת האתר");
$smarty->assign("name","אליהו");
$smarty->assign("a", 1);
$smarty->assign("users", $users);
$smarty->display('index.html');
?>
עד פה המדריך שלי :-)
תגובות לכתבה:
ממליץ יותר אל TWIG
האמת היא שעד עכשיו אף פעם לא השתמשתי ב smarty כי הוא תמיד נראה לי כבד מדי,
כמו שפת תכנות נוספת ש-php מפענחת ומריצה כדי ליצור את העמוד.
ולא ברור לי עד הסוף למה לכתוב {foreach from=users item=$user}
ולא <? foreach($users as $item) ?>
יש לה איזה מנגנון cache או יעול משלה?
תסביר למה אתה מעדיף את TWIG מאשר Smarty מה ההיתרונות שלו על Smarty.
Smarty מאפשרת לכתוב קוד php בתוך הtemplate והיא באמת קצת כבדה אבל אף פעם לא בדקתי את TWIG.
אני בטוח שאם תנסה את Smarty אתה תבין איך היא נוחה.
twig נחשבת למנוע התבניות הכי מהיר שקיים היום, אחרי Blitz, אבל Blitz לא כתוב ב php אלה ב-C וכדי לעבוד איתו יש לחבר אותו כ extension=blitz.so בשרת. החלטתי לא להשתמש בו בפרוייקטים שלי והלכתי על המהיר השני - twig.
twig, למשל, לא מאפשרת קוד php בתוך ה template.
אבל העבודה הזו מעלה את השאלה: למה לא לכתוב שם ישירות php, אלה את המבנים הטקסטואלים המוזרים האלה.
והאמת שבזמן האחרון הפסקתי להשתמש בכלל במנועי תבניות כאלה ואחרים בדיוק מאותה סיבה. הגעתי למסקנה ש-php בעצמה היא שפת תבניות.
יש אפשרות גם לשימוש כזה:
<html>
<head><?php include 'templates/head.php'; ?></head>
<body><?php include 'templates/body.php'; ?></body>
</html>
אני מכיר המון מערכות כאלו.
וגם Smarty לא מדפיס את הhtml הוא ממיר את הצד לקוח לצד שרת.
לא ממש הבנתי מה הוא ממיר ולאן.
יש רק צד שרת והרבה טקסט שמסודר באופן כזה שנקרא html
לדוגמה יש קובץ page.html
ורשום בו:
{$a}
אז הוא יוצר קובץ חדש בקימפולים ורשם בו
echo $smarty->GetVar("a");
מה שכן תצטרך לנסות לעבוד עם Smarty כדי להבין למה אני מתכוון
אין ספק שהוא נוח, וגם ענית לי על השאלה אם יש בו אופטימיזציה פנימית.
בכל אופן, מבחינתי האישית הפסקתי להשתמש בכלל בכל מנועי התבניות והגעתי למסקנה שעדיף לכתוב
<? foreach($users as $user): //x ?>
מאשר
{foreach from=users item=$user}
כי לדעתי php עצמה היא כבר שפת תבניות.
למנועי התבניות יש שני יתרונות על php פשוט:
א. הרבה יותר קשה להכניס _בטעות_ לוגיקה לתוך התבנית כשהיא לא צריכה להיות שם
ב. כשאתה נותן לאנשים אחרים שליתה על התבנית (למשל כל מתשמש יכול לערוך את ה-html שיוצג לו עצמו - איך שבא לו), אתה לא יכול לאפשר לו להשתמש ב php רגיל בתבנית, ולכן מנוע תבניות כזה מהווה סוג של ארגז חול.
לדעתי בזה נגמרים השימושים של מנוע תבניות ואני איבדתי את הסיבה להשתמש בהם.
יש את האפשרות להשתמש בקוד php בתוך תבנית.
וכן האמת php היא כן מין תבנית כזאת.
http://www.smarty.net/docsv2/en/language.function.php
לא כ"כ מצאתי לנכון לעבוד עם מנוע הטמפלייטים הזה .
הוא קצת מסורבל ולא נוח .
למה להשתמש ב-PHP במנוע תבנית? לא מבין מה הקטע הזה?
הרי אתה משתמש במנוע תבנית, וכל מה שאתה צריך לעשות יש את זה במנוע. במידה ולא (נדיר מאוד מאוד ולא קורה), אתה יכול לכתוב פלאגין בשניה שעושה את זה בצורה יותר טובה ממה שאתה חושב.
מנוע סמרטי הוא המנוע הכי טוב שיצא לי לעבוד איתו, וכל הפרוייקטים שלי בנויים עליו.
ולאלו ששואלים, אכן יש לו מנוע cache מיוחד שלו. הוא כמובן מקמפל את כל התבניות, ככה שלא תמיד הוא עושה את כל הפעולה.
צריך לקרוא קצת תיעוד כדי להבין את החוזק שעומד מאחוריו.
והנה לינק כטיפ:
http://www.smarty.net/why_use
בהצלחה לכולם !
KingYes.
המנוע די שימושי.
אני משתמש איתו הרבה בכל הפרוייקטים שלי, מנוע יעיל.
בהצלחה!
מדריך דיי מסובך בשבילי חח, אשמח אם תסבירו לי פה למה זה בידיוק עוזר ומה זה התנאים האלה ?
תתחיל מזה:
http://phpguide.co.il/mvc_מפרידים_html_מ_php.htm
המדריך הזה הוא למנוע תבניות מוכן בשם smarty
שתוכל להשתמש בו במקום לכתוב אחד משלך כפי שמתואר בקישור למעלה
תשמע אני סתם מרפרף בין הדפים
וככול שאני קורא יותר מדריכים אני מופתע יותר ויותר
לטובה.
עבודה יפה ,יש עניין במדריכים,מושקע
לא סתם כדי למלות חור ולאמר יש לי אתר לימוד.
פששששש פעמים welldone
יש דרך שאת הקימפולים הוא יעשה ב DB?
לא ממש הבנתי, מה זאת אומרת PHP היא שפת תבניות? אתם ממליצים להשתמש בsmarty או לא?
smarty ממש נוחה. אני משתמש בה, והיא מאוד נוחה.